package com.jvm.reentrantlockp;

import java.util.concurrent.locks.ReentrantLock;

// 使用 ReentrantLock 实现 3 个线程来对一个共享变量++操作
public class Demo3 {

    private static int num = 0;

    /**
     *
ReentrantLock 的使用过程：
创建锁：ReentrantLock lock = new ReentrantLock();
获取锁：lock.lock()
释放锁：lock.unlock();
     *
     */
    private static ReentrantLock lock = new ReentrantLock();

    private static void add() {

        lock.lock();
        try {
            num++;
        } finally {
            // **lock.unlock()**一定要放在 finally 中，
            // 否则，若程序出现了异常，锁没有释放，那么其他线程就再也没有机会获取这个锁了。
            lock.unlock();
        }

    }

    public static class T extends Thread {
        @Override
        public void run() {
            for (int i = 0; i < 10000; i++) {
                Demo3.add();
            }
        }
    }

    public static void main(String[] args) throws InterruptedException {
        T t1 = new T();
        T t2 = new T();
        T t3 = new T();

        t1.start();
        t2.start();
        t3.start();

        t1.join();
        t2.join();
        t3.join();

        System.out.println(Demo3.num);
    }

}
